package com.java.base.exercise.sentinel;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author RenPu
 * @Date 2022/5/1 18:39
 * @Version 1.0
 * @Description: 简单实现计数器限流算法
 **/
public class Counter {

    private long timeStamp=System.currentTimeMillis();  //系统当前时间
    private AtomicInteger reqCount=new AtomicInteger(0);                             //初始化计数器
    private final int limit=100;                        //时间窗口内最大请求数阀值
    private final long interval=1000*60;                //时间窗口ms


    /**
     * 简单限流核心逻辑方法
     * @return
     */
    public boolean limit(){
        //方法请求当前时间
        long now=System.currentTimeMillis();

        //判断当前请求是否在时间窗口内的请求时间
        if(now<timeStamp+interval){
            reqCount.getAndIncrement();

            //判断请求数是否，在时间窗口内的时间内超过limit的值，超过就返回false，做限流业务逻辑处理；
            return reqCount.get()<=limit;
        }else {
            //更新系统当前时间
            timeStamp=now;

            //超时后重置计数器
            reqCount.set(0);
            return true;
        }



    }


    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(0);

        for (int i = 0; i <10 ; i++) {
            atomicInteger.getAndIncrement();
        }
        System.out.println("重置前=========================:"+atomicInteger.get());
        atomicInteger.set(0);
        System.out.println("重置后==========######@@@@@@@===============:"+atomicInteger.get());

    }



}
